﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Bastanteo.Negocio;
using Bastanteo.Domain;

namespace Bastanteo.Controllers
{
    public class UsuarioController : Controller
    {
        #region Dependencias que se inyectan con Spring.NET
        IAdministracionService AdminService { get; set; }
        #endregion

        public ActionResult Index()     // Genera la vista Views/Rol/Index.aspx
        {
            ICollection<Usuario> modelo = AdminService.ListarUsuarios();
            TempData["Roles"] = ListadoRoles();
            return View(modelo);
        }
        [HttpPost]
        public ActionResult Buscar(FormCollection formulario)
        {
            string Codigo = (formulario["txtBuscarCod"] == string.Empty ? null : formulario["txtBuscarCod"]);
            string Usuario = (formulario["txtBuscarUsu"] == string.Empty ? null : formulario["txtBuscarUsu"]);
            int rolCodigo = 0;
            if (formulario["RolCodigo"] != null && formulario["RolCodigo"] != string.Empty)
                rolCodigo = int.Parse(formulario["RolCodigo"]);

            ICollection<Usuario> modelo = AdminService.ListarUsuariosXBusqueda(Codigo, Usuario, rolCodigo);
            TempData["Roles"] = ListadoRoles();
            return View("Index", modelo);
        }
        public ActionResult Creacion()       // Genera la vista Views/Local/Creacion.aspx
        {
            TempData["Roles"] = ListadoRoles();
            return View();
        }
        [HttpPost]
        public ActionResult Crear(FormCollection collection) // Recibe el formulario de Creacion.aspx
        {
            int nCodigo = int.Parse(((string)collection["rolcodigo"] == string.Empty ? "0" : (string)collection["rolcodigo"]));
            Usuario objACrear = new Usuario()
            {
                Codigo =  ((string)collection["codigo"] == string.Empty ? null : (string)collection["codigo"]),
                usuario = ((string)collection["Usuario"] == string.Empty ? null : (string)collection["Usuario"]),
                Password = ((string)collection["Password"] == string.Empty ? null : (string)collection["Password"]),
                Rol = AdminService.ObtenerRol(nCodigo),
            };

            try
            {
            // Coordinamos con el negocio para la funcionalidad
                Usuario objCreado = AdminService.CrearUsuario(objACrear);
                TempData["mensaje"] = "Rol " + objCreado.UsuarioId + " creado exitosamente";
                return RedirectToAction("Index"); // Todo bien, a la lista
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(string.Empty, ex.Message); // Agregamos el error a mostrarse
                TempData["Roles"] = ListadoRoles();
                return View("Creacion", objACrear); // Problemas! De nuevo a Creacion.aspx
            }
        }
        public ActionResult Visualizacion(int Codigo)     // Genera la vista Views/Local/Visualizacion.aspx
        {
            TempData["Roles"] = ListadoRoles();
            return View(AdminService.ObtenerUsuario(Codigo));
        }
        public ActionResult Modificacion(int Codigo)    // Genera la vista Views/Rol/Modificacion.aspx
        {
            TempData["Roles"] = ListadoRoles();
            return View(AdminService.ObtenerUsuario(Codigo));
        }
        [HttpPost]
        public ActionResult Modificar(FormCollection collection) // Recibe el formulario de Modificacion.aspx
        {
            int nCodigo = int.Parse(((string)collection["rolcodigo"] == string.Empty ? "0" : (string)collection["rolcodigo"]));
            Usuario objAModificar = new Usuario()
            {
                UsuarioId = int.Parse(collection["UsuarioId"]),
                Codigo = ((string)collection["Codigo"] == string.Empty ? null : (string)collection["Codigo"]),
                usuario = ((string)collection["Usuario"] == string.Empty ? null : (string)collection["Usuario"]),
                Password = ((string)collection["Password"] == string.Empty ? null : (string)collection["Password"]),
                Rol = AdminService.ObtenerRol(nCodigo),
            };
            try
            {
                Usuario objModificado = AdminService.ModificarUsuario(objAModificar);
                TempData["mensaje"] = "Usuario " + objAModificar.UsuarioId + " modificado exitosamente";
                return RedirectToAction("Index"); // Todo bien, a la lista
            }
            catch (Exception ex)
            {

                ModelState.AddModelError(string.Empty, ex.Message); // Agregamos el error a mostrarse
                TempData["Roles"] = ListadoRoles();
                return View("Modificacion", objAModificar); // Problemas! De nuevo a Modificacion.aspx
            }
        }
        public ActionResult Eliminacion(int Codigo)// Genera la vista Views/Rol/Eliminacion.aspx
        {
            return View(AdminService.ObtenerUsuario(Codigo));
        }
        [HttpPost]
        public ActionResult Eliminar(int Codigo) // Recibe el formulario de Eliminacion.aspx
        {
            try
            {
                Usuario objAEliminar = AdminService.ObtenerUsuario(Codigo);
                AdminService.EliminarUsuario(objAEliminar);
                TempData["mensaje"] = "Usuario " + objAEliminar.UsuarioId + " eliminado exitosamente";
                return RedirectToAction("Index"); // Todo bien, a la lista
            }
            catch (Exception ex)
            {

                ModelState.AddModelError(string.Empty, ex.Message); // Agregamos el error a mostrarse
                return View("Eliminacion", AdminService.ObtenerRol(Codigo)); // Problemas! De nuevo a Eliminacion.aspx
            }
        } 

        private ICollection<SelectListItem> ListadoRoles()
        {
            ICollection<SelectListItem> Roles = new List<SelectListItem>();
            Roles.Add(new SelectListItem() { Value = string.Empty, Text = "Seleccione.." });
            foreach (Rol obj in AdminService.ListarRoles())
                Roles.Add(new SelectListItem()
                {
                    Value = obj.RolId.ToString(),
                    Text = obj.RolDescripcion
                });
            return Roles;
        }

    }
}
